{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:03.368900Z",
     "iopub.status.busy": "2025-09-13T04:21:03.368725Z",
     "iopub.status.idle": "2025-09-13T04:21:06.398506Z",
     "shell.execute_reply": "2025-09-13T04:21:06.398047Z",
     "shell.execute_reply.started": "2025-09-13T04:21:03.368885Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>content</th>\n",
       "      <th>type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             content type\n",
       "0  马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...   体育\n",
       "1  商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...   体育\n",
       "2  冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...   体育\n",
       "3  辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...   体育\n",
       "4  揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...   体育"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "data = pd.read_excel('./data/data.xlsx')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分词处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:06.399892Z",
     "iopub.status.busy": "2025-09-13T04:21:06.399696Z",
     "iopub.status.idle": "2025-09-13T04:21:10.758325Z",
     "shell.execute_reply": "2025-09-13T04:21:10.757761Z",
     "shell.execute_reply.started": "2025-09-13T04:21:06.399879Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache /tmp/jieba.cache\n",
      "Loading model cost 0.699 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>content</th>\n",
       "      <th>type</th>\n",
       "      <th>content_cutted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...</td>\n",
       "      <td>体育</td>\n",
       "      <td>意外 受伤 国奥 警惕 无奈 大雨 格外 青睐 殷家 沈阳 报道 来到 沈阳 国奥 国奥队 ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...</td>\n",
       "      <td>体育</td>\n",
       "      <td>商瑞华 首战 复仇 心切 中国 玫瑰 要用 美国 方式 攻克 瑞典 瑞典 商瑞华 首战 信心...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...</td>\n",
       "      <td>体育</td>\n",
       "      <td>冠军 球队 迎新 新欢 欢乐 派对 大奖 体育 体育讯 冠军 高尔夫 高尔夫球 球队 迎新 ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...</td>\n",
       "      <td>体育</td>\n",
       "      <td>签约 危机 注册 难关 高层 威逼 威逼利诱 利诱 合同 笑里藏刀 藏刀 体育 体育讯 爆发...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...</td>\n",
       "      <td>体育</td>\n",
       "      <td>揭秘 谢亚龙 亚龙 带走 总局 电话 骗局 复制 轨迹 体坛 体坛周报 周报 特约 特约记者...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             content type  \\\n",
       "0  马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...   体育   \n",
       "1  商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...   体育   \n",
       "2  冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...   体育   \n",
       "3  辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...   体育   \n",
       "4  揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...   体育   \n",
       "\n",
       "                                      content_cutted  \n",
       "0  意外 受伤 国奥 警惕 无奈 大雨 格外 青睐 殷家 沈阳 报道 来到 沈阳 国奥 国奥队 ...  \n",
       "1  商瑞华 首战 复仇 心切 中国 玫瑰 要用 美国 方式 攻克 瑞典 瑞典 商瑞华 首战 信心...  \n",
       "2  冠军 球队 迎新 新欢 欢乐 派对 大奖 体育 体育讯 冠军 高尔夫 高尔夫球 球队 迎新 ...  \n",
       "3  签约 危机 注册 难关 高层 威逼 威逼利诱 利诱 合同 笑里藏刀 藏刀 体育 体育讯 爆发...  \n",
       "4  揭秘 谢亚龙 亚龙 带走 总局 电话 骗局 复制 轨迹 体坛 体坛周报 周报 特约 特约记者...  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "import jieba\n",
    " \n",
    "def chinese_word_cut(mytext):\n",
    "    # jieba.load_userdict('dic.txt')  # 这里你可以添加jieba库识别不了的网络新词，避免将一些新词拆开\n",
    "    jieba.initialize()\n",
    "    # 文本预处理 ：去除一些无用的字符只提取出中文出来\n",
    "    new_data = re.findall('[\\u4e00-\\u9fa5]+', mytext, re.S)\n",
    "    new_data = \" \".join(new_data)\n",
    " \n",
    "    # 文本分词\n",
    "    seg_list_exact = jieba.cut(new_data, cut_all=True)\n",
    "    result_list = []\n",
    "    with open('Stop Word Dictionary.txt', encoding='utf-8') as f: # 可根据需要打开停用词库，然后加上不想显示的词语\n",
    "        con = f.readlines()\n",
    "        stop_words = set()\n",
    "        for i in con:\n",
    "            i = i.replace(\"\\n\", \"\")   # 去掉读取每一行数据的\\n\n",
    "            stop_words.add(i)\n",
    " \n",
    "    for word in seg_list_exact:\n",
    "        if word not in stop_words and len(word) > 1:\n",
    "            result_list.append(word)      \n",
    "    return \" \".join(result_list)\n",
    "data[\"content_cutted\"] = data.content.apply(chinese_word_cut)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代码向量化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:10.759160Z",
     "iopub.status.busy": "2025-09-13T04:21:10.758864Z",
     "iopub.status.idle": "2025-09-13T04:21:13.863486Z",
     "shell.execute_reply": "2025-09-13T04:21:13.862689Z",
     "shell.execute_reply.started": "2025-09-13T04:21:10.759141Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 这里的词频矩阵可以看做是向量化，但是不体现语义含义\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "tf_vectorizer = CountVectorizer(strip_accents = 'unicode',\n",
    "                                max_features=500,  #提取500个特征词语\n",
    "                                stop_words='english',\n",
    "                                max_df = 0.5,  # 过滤在50%以上文档中出现的词（通用词）\n",
    "                                min_df = 5  # 保留至少在5个文档中出现的词（过滤极低频噪声）\n",
    ")\n",
    "tf = tf_vectorizer.fit_transform(data.content_cutted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建LDA模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:13.865437Z",
     "iopub.status.busy": "2025-09-13T04:21:13.865044Z",
     "iopub.status.idle": "2025-09-13T04:21:19.837755Z",
     "shell.execute_reply": "2025-09-13T04:21:19.837341Z",
     "shell.execute_reply.started": "2025-09-13T04:21:13.865413Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url();\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LatentDirichletAllocation(doc_topic_prior=0.1, learning_offset=50, max_iter=50,\n",
       "                          n_components=8, random_state=666,\n",
       "                          topic_word_prior=0.01)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LatentDirichletAllocation</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html\">?<span>Documentation for LatentDirichletAllocation</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_components',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_components&nbsp;</td>\n",
       "            <td class=\"value\">8</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('doc_topic_prior',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">doc_topic_prior&nbsp;</td>\n",
       "            <td class=\"value\">0.1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('topic_word_prior',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">topic_word_prior&nbsp;</td>\n",
       "            <td class=\"value\">0.01</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_method',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_method&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;batch&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_decay',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_decay&nbsp;</td>\n",
       "            <td class=\"value\">0.7</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_offset',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_offset&nbsp;</td>\n",
       "            <td class=\"value\">50</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_iter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_iter&nbsp;</td>\n",
       "            <td class=\"value\">50</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('batch_size',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">batch_size&nbsp;</td>\n",
       "            <td class=\"value\">128</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('evaluate_every',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">evaluate_every&nbsp;</td>\n",
       "            <td class=\"value\">-1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('total_samples',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">total_samples&nbsp;</td>\n",
       "            <td class=\"value\">1000000.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('perp_tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">perp_tol&nbsp;</td>\n",
       "            <td class=\"value\">0.1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('mean_change_tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">mean_change_tol&nbsp;</td>\n",
       "            <td class=\"value\">0.001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_doc_update_iter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_doc_update_iter&nbsp;</td>\n",
       "            <td class=\"value\">100</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">verbose&nbsp;</td>\n",
       "            <td class=\"value\">0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">random_state&nbsp;</td>\n",
       "            <td class=\"value\">666</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ],
      "text/plain": [
       "LatentDirichletAllocation(doc_topic_prior=0.1, learning_offset=50, max_iter=50,\n",
       "                          n_components=8, random_state=666,\n",
       "                          topic_word_prior=0.01)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# LDA的输入是词频矩阵，LDA 会根据这些词频信息，推断出文档 - 主题分布以及主题 - 词分布\n",
    "from sklearn.decomposition import LatentDirichletAllocation\n",
    "n_topics = 8  # 这里是设置LDA分类的主题个数，因为这里我们已经知道了每个内容的标签共有8个类型\n",
    "lda = LatentDirichletAllocation(n_components=n_topics, \n",
    "                                max_iter=50,# 迭代次数\n",
    "                                learning_method='batch',\n",
    "                                learning_offset=50,\n",
    "                                doc_topic_prior=0.1,# 文档 - 主题分布的先验参数\n",
    "                                topic_word_prior=0.01,# 主题 - 词分布的先验参数\n",
    "                               random_state=666)  \n",
    "lda.fit(tf)\n",
    "# 如果需要调参，可以使用GridSearchCV来搜索最优参数，搜索的参数有：n_topics, doc_topic_prior, topic_word_prior，评估指标可以使用perplexity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:19.838295Z",
     "iopub.status.busy": "2025-09-13T04:21:19.838162Z",
     "iopub.status.idle": "2025-09-13T04:21:19.842642Z",
     "shell.execute_reply": "2025-09-13T04:21:19.842169Z",
     "shell.execute_reply.started": "2025-09-13T04:21:19.838283Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Topic #0:\n",
      "经济 投资 市场 企业 政府 政策 银行 金融 美元 服务 美国 发展 计划 资金 行业\n",
      "Topic #1:\n",
      "学生 留学 申请 签证 大学 学校 教育 美国 移民 专业 心理 出国 学习 英国 选择\n",
      "Topic #2:\n",
      "电影 主持 主持人 导演 香港 票房 影片 观众 演员 很多 最佳 作品 上映 一部 拍摄\n",
      "Topic #3:\n",
      "比赛 赛季 主队 赔率 球队 主场 火箭 防守 表现 客场 球员 进攻 时间 数据 对手\n",
      "Topic #4:\n",
      "美国 中国 研究 时间 发现 科学 工作 世界 学家 日本 一种 国人 很多 人员 流感\n",
      "Topic #5:\n",
      "游戏 比赛 电子 中国 选手 竞技 决赛 电子竞技 玩家 争霸 网站 项目 手机 冠军 网络\n",
      "Topic #6:\n",
      "北京 项目 建筑 地产 城市 设计 发展 中国 生活 开发 艺术 很多 户型 活动 区域\n",
      "Topic #7:\n",
      "专家 匿名 老师 网友 谢谢 压力 支撑 持有 短期 走势 请问 分析 王老师 黄金 您好\n"
     ]
    }
   ],
   "source": [
    "# 提取并展示每个主题的关键代表性词语\n",
    "def print_top_words(model, feature_names, n_top_words):\n",
    "    tword = []\n",
    "    for topic_idx, topic in enumerate(model.components_):\n",
    "        print(f\"Topic #{topic_idx}:\")\n",
    "        # 使用get_feature_names_out获取特征名称，其返回的是一个numpy数组，这里进行适当处理来提取具体名称\n",
    "        feature_names_array = feature_names.flatten() if hasattr(feature_names, 'flatten') else feature_names\n",
    "        topic_w = \" \".join([feature_names_array[i] for i in topic.argsort()[:-n_top_words - 1:-1]])\n",
    "        tword.append(topic_w)\n",
    "        print(topic_w)\n",
    "    return tword\n",
    "\n",
    "# 输出每个主题对应词语\n",
    "n_top_words = 15\n",
    "# 将获取特征名称的方法改为使用get_feature_names_out，LDA新版更改了方法\n",
    "tf_feature_names = tf_vectorizer.get_feature_names_out()\n",
    "topic_word = print_top_words(lda, tf_feature_names, n_top_words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:21:19.843150Z",
     "iopub.status.busy": "2025-09-13T04:21:19.843011Z",
     "iopub.status.idle": "2025-09-13T04:21:20.369061Z",
     "shell.execute_reply": "2025-09-13T04:21:20.368520Z",
     "shell.execute_reply.started": "2025-09-13T04:21:19.843138Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.00179231 0.0017924  0.0017925  0.43914031 0.55010537 0.00179242\n",
      " 0.00179249 0.0017922 ]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "topics=lda.transform(tf)\n",
    "print(topics[0]) # 查看第一篇文章的主题概率,反应第一篇文章在不同主题下的可能性大小\n",
    "topic = []\n",
    "for t in topics:\n",
    "    topic.append(list(t).index(np.max(t)))\n",
    "data['topic']=topic\n",
    "data.to_excel(\"./temp/data_topic.xlsx\",index=False)  # 将结果保存为Excel文件"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 困惑度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:24:31.247929Z",
     "iopub.status.busy": "2025-09-13T04:24:31.247710Z",
     "iopub.status.idle": "2025-09-13T04:25:00.169995Z",
     "shell.execute_reply": "2025-09-13T04:25:00.169484Z",
     "shell.execute_reply.started": "2025-09-13T04:24:31.247914Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练进度：[██████████████████████████████] 100.0% （主题数：20/20）\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA0GFJREFUeJzs3Xl8E3X+x/H3JGl636XlLvcll4JKuUEFEf2BuuouK3it1+K56Lrrugjeusq63rreB94niCAi96WgKIuIIDfYu/Q+k+/vj5rYpJM2bdPPzJT38/HwoU7S5DXTZNJvMvmOppRSICIiIiIiIqKQsxkdQERERERERNRWcdBNRERERERE1Eo46CYiIiIiIiJqJRx0ExEREREREbUSDrqJiIiIiIiIWgkH3URERERERESthINuIiIiIiIiolbCQTcRERERERFRK+Ggm4iIiIiIiKiVcNBNx4VLL70UmqZh//79RqdYxssvvwxN0/Dyyy8bnWIa8+bNg6ZpWLVqldh9duvWDd26dRO7v5Z67LHHcMIJJyAqKgqapuHRRx9t9m2tWrUKmqZh3rx5IesjeePHj4emaS26Den9UXNeM6ReZzRNw/jx44O67+rqasybNw+9e/dGeHg4NE3DRx991OhlZD56v/fjQShfUySEYn9HbRMH3WRZW7duxRVXXIHevXsjOjoakZGR6NmzJ2bOnInly5cbnUfUaowY/Afjrbfewo033ojw8HDceOONuPPOOzFixIgGf8asbyp4BjGbNm1q9LqeP7I8/4SFhSE5ORlDhw7FFVdcgaVLl8Ltdjd6OxMnToSmaRg4cGAoVoFCzIpvAj3yyCOYP38+OnbsiFtuuQV33nkn+vXr1+hlVmLF3wsFpy29phA5jA4gaiq3241bbrkF//73v+FwODBx4kT83//9H8LCwrB37158+umneP3113HXXXfhn//8p9G5lnXuuedixIgR6NChg9Epx7UVK1YYnRC0xYsXe//dsWNHg2vkzZkzBzExMXC73Th27Bh27tyJN954Ay+++CJGjhyJN998E127dtX92b1793oHDzt27MDmzZtx6qmnCq8Bedx///3429/+hk6dOhmdEpRAvYsXL0ZMTAyWL18Op9MZ9GVEZmDF15RXX30VZWVlRmeQCXHQTZZzxx134N///jeGDh2K9957Dz179vS5vLy8HE88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nY3edkJCAu68807vpDg33XST9zL/yYK+/vprPPTQQ5gwYQKuvvpqfPvtt/joo4+wfft2/O9//0NERIT3ups3b8bkyZNRWlqKs88+G71798b+/fvxxhtv4LPPPsPGjRvRo0ePRvtCyWaz4R//+Ae+/PJLvP322/jrX//qc/myZctw5MgR/PnPf4bT6cTMmTNx55134t1339V9860xF110EbZv347/+7//Q3l5Od544w2cffbZWL9+Pa666ipUVVXhggsu8Hms79u3z+fIlnXr1mHy5MmoqqrC7373O3Tr1g0bN27Ef/7zHyxevBibNm1CSkqK9/orVqzAlClTYLPZcNFFF6Fjx45YsWIFRo0aVe85CdQOwv74xz/izTffRO/evTFjxgw4nU4sX74cV1xxBX744Qc8/PDDTV53oPbNqEcffRQrV67E8OHDAdR+LWnNmjUA4P1D3sPz/57Bm57x48dj//79eOWVVzBu3Difx2hCQoLPdYN9nWnI3Xffjblz5yItLQ1XXnklwsLC8Pbbb2Pnzp1B/bynz//5lZCQgKFDhwa8zOPpp5/G7NmzkZCQgHPOOQepqanYsmUL7r33XqxcuRIrV66s9wn5hg0bcN9992HChAm46qqrcPDgQQDN/10H83ralN9LIJ988gk+/fRTnHPOORg5ciTWrFmDV199FT///DPWrVsX1G00pKqqCmeccQYqKipw0UUXISsrC++88w5OP/10bNiwAZMnT0aHDh1w8cUXY8+ePVi0aBGmTp2KnTt3wm63+9xWU16vKisrceaZZ2LVqlXe+SWqq6vx6aefYtq0aXj88cdx3XXX1eu9/vrrsWnTJkydOtX7uweASy65BO+88w4GDx6Myy67DOHh4Th06BBWrlyJr7/+GkOGDGl0W5jhNeWGG27A448/jk6dOuGKK64AALz//vu47LLL8O233+I///lPvdvetGkT7r//fpx55pm4/vrrsWPHDnz44YdYu3YtNm3aFNRrypw5c7BgwQIkJSVh+vTpSE1NxaFDh/DFF19g2LBhGDhwIJRSmDx5MjZv3oxRo0bhzDPPhM1mw4EDB/DJJ59g5syZun97kkUoIgsZP368AqC++OKLJv3cJZdcogCo7t27q6NHj3qX5+TkqISEBBUbG6sqKyu9y48dO6by8vLq3c6XX36pbDab+tOf/uSz/M4771QA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/3ajpuN3usly7rnnHlRUVODf//43+vbti4kTJ2LgwIEICwvDvn378MUXXyAvL69FL4LXX389rr/+epx44on43e9+h5qaGixfvhxKKQwZMsQ70U1znX766ZgxYwYWLlyIQYMGYfr06aisrMQ777yDU089FYsWLar33Z8333wTEyZMwO9//3s8+uijOOmkkxAZGYmDBw9i48aNyMnJ8b7IvPbaa3j22WcxduxY9OzZE3Fxcfjhhx+wZMkSJCUl4bLLLmtRfyhNnjwZGRkZ+P3vf4927dphxYoV2LJlC0aMGIHrr7/ee7127drhzTffxAUXXIAhQ4bgzDPPRL9+/VBZWYn9+/dj9erVGDlyJJYuXdqk+x88eDDWrVuHk08+Gaeffrr3vKc1NTV47rnnEBkZ2eDPN7XrxhtvxK5du/Dwww9733UfMWIE7rzzTvzzn//Erbfeiscff7zB+5wwYQI0TcPtt9+OHTt2ID4+HgkJCfXOuXrNNdfg3XffRVZWFubMmdPghHL+evbsiQcffBBz5szB4MGDceGFFyI6OhqLFi3Crl27MG3aNFx88cVB314gEydOxJYtWzBlyhSMGTMGTqcTY8eOxdixY5t8W+Hh4XjvvfcwZcoUjBs3DhMnTsSgQYOgaRoOHDiAtWvXIjk5uUkTdN19990B/6D629/+hn79+nn//+GHH0ZMTAzcbjeKiorwww8/YO3ataioqMCoUaPw5ptver/3+Pbbb6OkpASXXHJJvUkJPWw2G2bNmoX77rsPr7zyivcP09Zms9nw8ssvY/LkyTjrrLNwwQUXID09HRs3bsSqVavQs2dP7wR9nus/99xzOOuss3D66ad7z9P95Zdf4pdffsHgwYN93lgDaif727RpE1555RWsX78ep59+Ojp27IisrCz8+OOP2Lx5MxYuXOg9D31zTJgwAQ888ABycnLqPVYnTJjg/SM62EF3v3790LFjR7z11lsIDw9H586doWkarr/++kYPL22KXr16Ye7cubjzzju9zz2Hw4H3338fgwcPxq5du0J2X3oGDhyIp556Ctdeey369u2Ls846Cz179kRxcTH27t2L1atX49JLL8UzzzwT1O219u9a6vfidDpx/fXX47777sNJJ52EadOmobi4GIsWLcK4ceN0J9IMtaa8Xs2fPx/ffPMNHnvsMXz66acYO3YsUlNTceTI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q3bradGg+7nnnkNmZibee+89DB8+HI888ggGDhyI4cOH4z//+Q+ysrJC1Ul+lFIoKCiw3IOwOd19ksMxoF04AGBXbiV25shPqHY8bW8zYLcsdstityx2y2K3LHbLYrcsq3brafFEamFhYTj33HPx3nvvISsrC8899xzi4+MxZ84cdOnSBWeddRYWLlyI8vLyUPTScWqa3+nDiIiIiIiIrCCks5fHxcXhiiuuwIMPPohzzz0XNTU1WLp0KS6++GK0b98et956K0pLS0N5l3ScmNwrFpGO2okUlu0pRlm12+AiIiIiIiKixoVs0L1v3z7cc8896N+/P0499VSsXr0a1113Hb766its27YNM2fOxGOPPYZZs2aF6i6Pew6Hw+iEZmlOd7TThkm9YgEApdUKX/xcEuqsRh1P29sM2C2L3bLYLYvdstgti92y2C3Lqt3+WjTozsvLw1NPPYWRI0eiV69euPfeezFw4EB89NFHOHr0KB577DEMHz4cgwcPxhNPPIG77roLS5cuDXh7Tz/9NAYPHoy4uDjExcUhIyMDn332mffyiooKzJ49G8nJyYiJicH5559f73vjBw8exNSpUxEVFYXU1FTceuutqKmpaclqmpLNZkNKSgpsNmudar0l3dPrHmIuPKHa8bi9jcRuWeyWxW5Z7JbFblnslsVuWVbt1tOiNejQoQOuu+46aJqGp556Cr/88gveffddnHPOObrvSpxwwglITU0NeHudO3fGAw88gK1bt2LLli2YOHEipk2bhh07dgAAbr75ZixatAjvvvsuVq9ejaNHj+K8887z/rzL5cLUqVNRVVWFDRs24JVXXsHLL7+MuXPntmQ1TUkphbKyMstNLNCS7hNSw9EzyQkA2J5VgZ/zK0OdF9DxuL2NxG5Z7JbFblnslsVuWeyWxW5ZVu3W06JB9+23347du3dj/fr1uPrqq5GQkNDg9c8++2zs27cv4OXnnHMOzjrrLPTu3Rt9+vTBvffei5iYGGzatAmFhYV44YUXsGDBAkycOBHDhg3DSy+9hA0bNmDTpk0AgM8//xw//PADXn/9dQwdOhRTpkzB3XffjSeffBJVVVUtWVXTUUqhqKjIcg/ClnRrmubzabfk6cOOx+1tJHbLYrcsdstityx2y2K3LHbLsmq3nhYNunv06AG73R7w8v379+PVV19t1m27XC689dZb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dZSAFBUViQceeEC0adNGWK1WkZ6eLv7yl7+IyspKraP59e6774r09HRhNptFUlKSmDJliigoKNA6Vj3+tjOqqopHH31UJCYmCovFIoYNG6b5+8df5tdee83n/bNnzw7a3K7Lm/n62rhxY9DmLi8vF2PGjBEpKSnCbDaL5ORkMWrUKPH1119rmtlfbl+C5ZJhjeUuKysTI0aMEPHx8SIkJESkpaWJ3/3ud+LUqVNaxw5oeb/66quiQ4cOwmq1it69e4sPP/xQu8C1Asn9r3/9S9hstqBah/vLffLkSTFx4kSRkpIirFar6Ny5s3j66ac1v0yov9zPP/+8SE1NFSEhIaJNmzbir3/9qy62+XUpQujsLHQiIiIiIiIineA53UREREREREQthEU3ERERERERUQth0U1ERERERETUQlh0ExEREREREbUQFt1ERERERERELYRFNxEREREREVELYdFNRERERERE1EJYdBMRERERERG1EBbdREREOrBp0yYoioLly5drHSUgWVlZuOmmmxAbGwtFUfDcc89pHQkA0LZtW0ycOFHrGEREdAExaR2AiIiIzj/Tp0/HunXrMHv2bCQlJaF///4+H1dWVoYnn3wSV155Ja688kq5IYmIiCRg0U1ERETN7vPPP8fo0aPx4IMPNvq4srIyPPbYYwAgpejeu3cvDAYO9CMiInm41SEiIiK30tLSZnme7OxsREVFNctzNSeLxYKQkBCtYxAR0QWERTcREVEdc+bMgaIoOHDgACZOnIioqChERkbirrvuQllZmftxhw8fhqIoeP311+s9h6IomDNnTr3n3LdvH+644w5ERkYiPj4ejz76KIQQOHr0KEaPHo2IiAgkJSXh6aef9pnN6XTikUceQVJSEux2O0aNGoWjR4/We9z27dsxcuRIREZGIjQ0FEOGDMH//vc/n/P5008/4bbbbkN0dDQuv/zyRpfNwYMHcfPNNyMmJgahoaG47LLLsHr1avf9r7/+OhRFgRACCxcuhKIoUBTF53MdPnwY8fHxAIDHHnvM/VjP5fb555/jiiuugN1uR1RUFEaPHo09e/b4nI+ff/4ZY8eORUREBGJjY/HAAw+goqLC67G+zukuKCjA9OnT0bZtW1gsFqSmpmL8+PHIzc11P2bBggXo3r07QkNDER0djf79+2PZsmWNLisiIiKAw8uJiIgaNHbsWLRr1w5z587Fzp078corryAhIQHz588/6+ccN24cunbtinnz5mH16tX4xz/+gZiYGPzrX//C0KFDMX/+fLz99tt48MEHcfHFF2Pw4MFev//4449DURTMnDkT2dnZeO655zB8+HBkZmbCZrMBqClUMzIy0K9fP8yePRsGgwGvvfYahg4dii+++AKXXHKJ13PefPPN6NixI5544gkIIRrMnpWVhYEDB6KsrAz3338/YmNjsXTpUowaNQrLly/HmDFjMHjwYLz55pu48847cdVVV2H8+PENPl98fDwWLVqEe++9F2PGjMENN9wAAOjVqxcAYMOGDcjIyEB6ejrmzJmD8vJyLFiwAIMGDcLOnTvRtm1br+cbO3Ys2rZti7lz52Lbtm144YUXkJ+fjzfeeKPBDCUlJbjiiiuwZ88eTJo0CX379kVubi5WrlyJY8eOIS4uDi+//DLuv/9+3HTTTe5C/ocffsD27dtx2223NfjcREREAABBREREXmbPni0AiEmTJnlNHzNmjIiNjXXfPnTokAAgXnvttXrPAUDMnj273nP+/ve/d09zOBwiNTVVKIoi5s2b556en58vbDabmDBhgnvaxo0bBQDRqlUrUVRU5J7+3nvvCQDi+eefF0IIoaqq6Nixo7j66quFqqrux5WVlYl27dqJq666ql6mW2+9NaDlMm3aNAFAfPHFF+5pxcXFol27dqJt27bC6XR6zf+UKVP8PmdOTk69ZeXSp08fkZCQIPLy8tzTvv/+e2EwGMT48ePrzceoUaO8fv+Pf/yjACC+//5797S0tDSv5Tpr1iwBQHzwwQf1Xt+1/EaPHi26d+/ud16IiIh84fByIiKiBtxzzz1et6+44grk5eWhqKjorJ9z8uTJ7p+NRiP69+8PIQTuvvtu9/SoqCh07twZBw8erPf748ePR3h4uPv2TTfdhOTkZHzyyScAgMzMTOzfvx+33XYb8vLykJubi9zcXJSWlmLYsGHYsmULVFVtdD4b8sknn+CSSy7xGoIeFhaG3//+9zh8+DB++umnwBZCAE6ePInMzExMnDgRMTEx7um9evXCVVdd5Z5fT1OmTPG6fd9997lzN+T9999H7969MWbMmHr3uYbFR0VF4dixY/jmm2/Oal6IiOjCxqKbiIioAW3atPG6HR0dDQDIz89vtueMjIyE1WpFXFxcvem+Xqdjx45etxVFQYcOHXD48GEAwP79+wEAEyZMQHx8vNfXK6+8gsrKShQWFno9R7t27QLKfuTIEXTu3Lne9K5du7rvby6u52ro9Vw7EjzVXTbt27eHwWBwLxtffvnlF/To0aPRLDNnzkRYWBguueQSdOzYEVOmTKl3fjwREVFDeE43ERFRA4xGo8/pova854YahDmdziY9p7/XaQrXUeynnnoKffr08fmYsLAwr9uuc8HPNw39fZqqa9eu2Lt3L1atWoW1a9fi/fffx0svvYRZs2a5L3dGRETUEBbdREREZ8l15LugoMBrenMe8a3LdSTbRQiBAwcOuJuPtW/fHgAQERGB4cOHN+trp6WlYe/evfWm//zzz+77m6qhwtj1XA29XlxcHOx2u9f0/fv3ex21P3DgAFRVrddwzVP79u2xe/duvzntdjvGjRuHcePGoaqqCjfccAMef/xxPPzww7BarX5/n4iILlwcXk5ERHSWIiIiEBcXhy1btnhNf+mll1rsNd944w0UFxe7by9fvhwnT55ERkYGAKBfv35o3749/vnPf6KkpKTe7+fk5Jz1a19zzTX4+uuvsXXrVve00tJSLFmyBG3btkW3bt2a/JyhoaEA6u+4SE5ORp8+fbB06VKv+3bv3o1PP/0U11xzTb3nWrhwodftBQsWAIB72fhy44034vvvv8eKFSvq3ecaaZCXl+c13Ww2o1u3bhBCoLq6uuGZIyIiAo90ExERnZPJkydj3rx5mDx5Mvr3748tW7Zg3759LfZ6MTExuPzyy3HXXXchKysLzz33HDp06IDf/e53AACDwYBXXnkFGRkZ6N69O+666y60atUKx48fx8aNGxEREYGPP/74rF77oYcewjvvvIOMjAzcf//9iImJwdKlS3Ho0CG8//77MBiavi/fZrOhW7duePfdd9GpUyfExMSgR48e6NGjB5566ilkZGRgwIABuPvuu92XDIuMjPS6lrfLoUOHMGrUKIwcORJbt27FW2+9hdtuuw29e/du8PVnzJiB5cuX4+abb8akSZPQr18/nD59GitXrsTixYvRu3dvjBgxAklJSRg0aBASExOxZ88evPjii7j22mu9mtoRERH5wqKbiIjoHMyaNQs5OTlYvnw53nvvPWRkZGDNmjVISEhokdd75JFH8MMPP2Du3LkoLi7GsGHD8NJLL7mPGAPAlVdeia1bt+Lvf/87XnzxRZSUlCApKQmXXnop/vCHP5z1aycmJuKrr77CzJkzsWDBAlRUVKBXr174+OOPce211571877yyiu47777MH36dFRVVWH27Nno0aMHhg8fjrVr12L27NmYNWsWQkJCMGTIEMyfP99n87d3330Xs2bNwkMPPQSTyYSpU6fiqaeeavS1w8LC8MUXX2D27NlYsWIFli5dioSEBAwbNgypqakAgD/84Q94++238cwzz6CkpASpqam4//778de//vWs55mIiC4cijibLi1EREREQWLOnDl47LHHkJOTU68LPBERkdZ4TjcRERERERFRC2HRTURERERERNRCWHQTERERERERtRCe001ERERERETUQnikm4iIiIiIiKiFsOgmIiIiIiIiaiEsuomIiIiIiIhaCItuIiIiIiIiohbCopuIiIiIiIiohbDoJiIiIiIiImohLLqJiIiIiIiIWgiLbiIiIiIiIqIWwqKbiIiIiIiIqIX8PzHAfCMjQdViAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import LatentDirichletAllocation\n",
    "\n",
    "# 存储困惑度和得分的列表\n",
    "plexs = []\n",
    "scores = []\n",
    "n_max_topics = 20  # 最大主题数保持为20（不修改）\n",
    "bar_length = 30  # 进度条长度\n",
    "\n",
    "# 遍历1到20个主题（共20个主题数）\n",
    "for i in range(1, n_max_topics + 1):\n",
    "    # 计算进度百分比（总进度基于20个主题）\n",
    "    progress = i / n_max_topics\n",
    "    completed = int(progress * bar_length)\n",
    "    progress_bar = '[' + '█' * completed + ' ' * (bar_length - completed) + ']'\n",
    "    percentage = f\"{progress * 100:.1f}%\"\n",
    "    \n",
    "    # 显示进度条（明确标注总主题数为20）\n",
    "    print(f'训练进度：{progress_bar} {percentage} （主题数：{i}/{n_max_topics}）', \n",
    "          end='\\r', flush=True)\n",
    "    \n",
    "    # 训练对应主题数的LDA模型\n",
    "    lda = LatentDirichletAllocation(\n",
    "        n_components=i,  # 主题数从1到20\n",
    "        max_iter=5,\n",
    "        learning_method='batch',\n",
    "        learning_offset=50,\n",
    "        random_state=666\n",
    "    )\n",
    "    lda.fit(tf)  # 假设tf是已准备好的文档-词矩阵\n",
    "    plexs.append(lda.perplexity(tf))  # 存储当前主题数的困惑度\n",
    "    scores.append(lda.score(tf))  # 存储当前主题数的似然得分\n",
    "\n",
    "# 训练结束后换行，避免覆盖后续输出\n",
    "print()\n",
    "\n",
    "# 可视化困惑度曲线（可按需调整展示的主题数范围）\n",
    "n_t = n_max_topics  # 示例：展示主题的结果（如需展示更多可增大此值，最大为n_max_topics）\n",
    "x = list(range(1, n_t))  # x轴：主题数1到n_t-1\n",
    "plt.figure(figsize=(10, 6))\n",
    "# 绘制困惑度曲线（plexs[:n_t-1]对应主题1到n_t-1）\n",
    "plt.plot(x, plexs[:n_t-1], marker='o', color='#3498db', linewidth=2, markersize=6)\n",
    "plt.xlabel(\"number of topics\", fontsize=12)\n",
    "plt.ylabel(\"perplexity\", fontsize=12)\n",
    "plt.title(\"Changes in perplexity of the LDA model with different numbers of topics\", fontsize=14)\n",
    "plt.xticks(x)  # 显示所有主题数刻度\n",
    "plt.grid(alpha=0.3, linestyle='--')  # 网格线增强可读性\n",
    "plt.tight_layout()  # 自动调整布局\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LDA模型可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:26:08.424841Z",
     "iopub.status.busy": "2025-09-13T04:26:08.424609Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Serving to http://127.0.0.1:8889/    [Ctrl-C to exit]\n"
     ]
    }
   ],
   "source": [
    "import pyLDAvis\n",
    "import pyLDAvis.lda_model\n",
    "\n",
    "pyLDAvis.enable_notebook()  # 启用 Jupyter Notebook 支持\n",
    "\n",
    "# 假设 lda 是一个训练好的 LDA 模型，tf 是文档词矩阵，tf_vectorizer 是 CountVectorizer 或 TfidfVectorizer 对象\n",
    "pic = pyLDAvis.lda_model.prepare(lda, tf, tf_vectorizer)  # 使用 lda_model.prepare 方法\n",
    "\n",
    "# 保存可视化结果为 HTML 文件\n",
    "pyLDAvis.save_html(pic, './temp/' + 'lda_pass' + str(n_topics) + '.html')\n",
    "\n",
    "# 显示可视化结果\n",
    "pyLDAvis.show(pic, local=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (myname)",
   "language": "python",
   "name": "venv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
